package com.weiawei.Model;

public class VictoryJudgement {

    /**
     * 判断角色是否获胜
     *
     * @param x 棋子x坐标
     * @param y 棋子y坐标
     * @param chess 棋盘落子情况
     * @param role 棋子所属角色
     */
    public static int WinnerJudge(int x, int y, int[][] chess, int role) {
        int ans = new VictoryJudgement().shangxiaJudge(x, y, chess, role);
        if (ans == 0)
            ans = new VictoryJudgement().shuipingJudge(x, y, chess, role);
        if (ans == 0)
            ans = new VictoryJudgement().youxieJudge(x, y, chess, role);
        if (ans == 0)
            ans = new VictoryJudgement().zuoxieJudge(x, y, chess, role);
        if (ans == 0)
            return 0;
        return role;
    }

    /**
     * 棋子竖直方向上判断角色是否获胜
     *
     * @param x 棋子x坐标
     * @param y 棋子y坐标
     * @param chess 棋盘落子情况
     * @param role 棋子所属角色
     */
    private int shangxiaJudge(int x, int y, int[][] chess, int role) {  // 竖直方向判断
        int startY = y, count = 1;
        while (true) {
            //向上判断
            y--;
            if (x >= 0 && x <= 18 && y >= 0 && y <= 18 && chess[x][y] == role)
                count++;
            else
                break;
        }
        y = startY;
        while (true) {
            //向下判断
            y++;
            if (x >= 0 && x <= 18 && y >= 0 && y <= 18 && chess[x][y] == role)
                count++;
            else
                break;
        }
        if (count >= 5)
            return role;
        else
            return 0;
    }

    /**
     * 棋子水平方向上判断角色是否获胜
     *
     * @param x 棋子x坐标
     * @param y 棋子y坐标
     * @param chess 棋盘落子情况
     * @param role 棋子所属角色
     */
    private int shuipingJudge(int x, int y, int[][] chess, int role) {  // 水平方向判断
        int startX = x, count = 1;
        while (true) {
            //向左判断
            x--;
            if (x >= 0 && x <= 18 && y >= 0 && y <= 18 && chess[x][y] == role)
                count++;
            else
                break;
        }
        x = startX;
        while (true) {
            //向下判断
            x++;
            if (x >= 0 && x <= 18 && y >= 0 && y <= 18 && chess[x][y] == role)
                count++;
            else
                break;
        }
        if (count >= 5)
            return role;
        else
            return 0;
    }

    /**
     * 棋子右倾斜方向上判断角色是否获胜
     *
     * @param x 棋子x坐标
     * @param y 棋子y坐标
     * @param chess 棋盘落子情况
     * @param role 棋子所属角色
     */
    private int youxieJudge(int x, int y, int[][] chess, int role) {  // 右倾斜方向判断
        int startX = x, startY = y, count = 1;
        while (true) {
            //向右上判断
            x++;
            y--;
            if (x >= 0 && x <= 18 && y >= 0 && y <= 18 && chess[x][y] == role)
                count++;
            else
                break;
        }
        x = startX;
        y = startY;
        while (true) {
            //向左下判断
            x--;
            y++;
            if (x >= 0 && x <= 18 && y >= 0 && y <= 18 && chess[x][y] == role)
                count++;
            else
                break;
        }
        if (count >= 5)
            return role;
        else
            return 0;
    }

    /**
     * 棋子左倾斜方向上判断角色是否获胜
     *
     * @param x 棋子x坐标
     * @param y 棋子y坐标
     * @param chess 棋盘落子情况
     * @param role 棋子所属角色
     */
    private int zuoxieJudge(int x, int y, int[][] chess, int role) {  // 左倾斜方向判断
        int startX = x, startY = y, count = 1;
        while (true) {
            //向左上判断
            x--;
            y--;
            if (x >= 0 && x <= 18 && y >= 0 && y <= 18 && chess[x][y] == role)
                count++;
            else
                break;
        }
        x = startX;
        y = startY;
        while (true) {
            //向右下判断
            x++;
            y++;
            if (x >= 0 && x <= 18 && y >= 0 && y <= 18 && chess[x][y] == role)
                count++;
            else
                break;
        }
        if (count >= 5)
            return role;
        else
            return 0;
    }
}
